/*
 * ClienteHTTP.java
 *
 * Created on 7 de marzo de 2006, 09:03 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package ig.util;

import ig.metrica.escenario.GeneraEscenarioBean;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;

/**
 *
 * @author jsanchez
 * 
 * Esta clase es la encargada de conectarse al servido JBoss para pedirle via http las salidad de 
 * la generación de un escenario-
 * 
 */
public class ClienteHTTP {
    
    /**
     * Constructor por defecto
     */
    public ClienteHTTP() {
    }

    /**
     * Metodo encargado de la conexion a servidor http
     * 
     * @return verdadero y se pudo conectar o falso de lo contrario
     */
    private boolean conectar() {
        try {
            host = LoadProperties.getProperties("server/configuracion.properties", "host");
            pueto = Integer.parseInt(LoadProperties.getProperties("server/configuracion.properties", "puertoHttp"));
            socket = new Socket(host, pueto);
            is = socket.getInputStream();
            os = socket.getOutputStream();
            entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            br = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

        } catch (Exception ex) {
            /*JOptionPane.showMessageDialog(null, 
            "El Host no responde, pruebe lo siguiente:\n" +
            "- Abra su Navegador de Internet y escriba en la barra de direcciones los sigeuinte:\n" +
            "   'http://"+host+":"+pueto+"'\n" +
            "   aparecera la pagina de bienvenida de JBoss Aplication Server\n\n" +
            "   si no aparece cambie de puerto por el puerto "+pueto+".\n" +
            "   Lo puede modificar en la Opción Propiedades en el menu Servidor en la ventana de Logueo.");*/
            ex.printStackTrace();
            return false;
        }
        dis = new DataInputStream(is);
        ps = new PrintStream(os);

        return true;
    }

    /**
     * Hace la peticion al servidor y retorna una cadena de caracteres que es la pgina o el objeto que 
     * el servidor de aplicaciones retorna.
     * 
     * @param pathHtml
     * @return
     */
    public String getHTML(String pathHtml) {

        
        if (END != null) {
            String RETUNR = "";
            if (END.trim().equals("PROCESO_INTERRUMPIDO_POR_EL_USUARIO")) {
                RETUNR = "PROCESO_INTERRUMPIDO_POR_EL_USUARIO";
            } else if (END.trim().equals("END_PROCESS")) {
                RETUNR = "END_PROCESS";
            } else if (END.trim().startsWith("NOMBRE_ESCENARIO")) {
                RETUNR = END.trim();
            }
            END = null;
            return RETUNR;
        }
        
        
        if (true || conectar()) {
            HEADER = new StringBuffer("");
            HTML = new StringBuffer("");
            try {
                //ps.println("POST /" + pathHtml + secuencia + ".html HTTP/1.0");
                //ps.println("User-Agent: Java");
                //ps.println("Content-type: application/x-www-form-urlencoded");
                //ps.println("Content-length: " + 0);
                //ps.println();
                //ps.flush();
                
                String linea =  lookupEsceraio().getLinea(secuencia,dir);
                
                /*while ((linea = entrada.readLine()) != null) {
                    HEADER.append(linea + "\n");
                    if (linea.equals("")) {
                        break;
                    }
                }*/

                boolean body = true;
                //boolean body = false;
                //while ((linea = entrada.readLine()) != null) {
                if ( linea != null ) {
                    if (linea.trim().equals("<body>")) {
                        body = true;
                        linea = entrada.readLine();
                    } else if (linea.trim().equals("</body>")) {
                        body = false;
                    }
                    if (body && !linea.trim().equals("")) {
                        if (linea.trim().equals("PROCESO_INTERRUMPIDO_POR_EL_USUARIO") || linea.trim().equals("END_PROCESS") || linea.trim().startsWith("NOMBRE_ESCENARIO")) {
                            END = linea.trim();
                        }
                        HTML.append(linea.trim().replace("<BR>", "\n"));
                        numeroLinea++;
                    }
                }
                if (!HTML.toString().equals("")) {
                    secuencia++;
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                try {
                    is.close();
                    dis.close();
                    os.close();
                    ps.close();
                    socket.close();
                } catch (Exception e) {}
                return HTML.toString();
            }
        }
        return "";
    }

    //private GeneraEscenario generaEscenario = null;
    private GeneraEscenarioBean lookupEsceraio() throws Exception {
        return new GeneraEscenarioBean();
        /*try {
            if( generaEscenario == null ){
                Properties prop = new Properties();
                prop.put(Context.INITIAL_CONTEXT_FACTORY, IGBean.INITIAL_CONTEXT_FACTORY);
                String Sockec = new ConexionServer().getSocketServer();
                prop.put(Context.PROVIDER_URL, Sockec);

                javax.naming.Context c = new javax.naming.InitialContext(prop);

                Object remote = c.lookup("ig.metrica.escenario.GeneraEscenario");

                GeneraEscenarioHome rv = (GeneraEscenarioHome) javax.rmi.PortableRemoteObject.narrow(remote, GeneraEscenarioHome.class);
                generaEscenario = rv.create();
            }
            return generaEscenario;
        } catch (javax.naming.NamingException ne) {
            throw new Exception(ne);
        } catch (javax.ejb.CreateException ce) {
            throw new Exception(ce);
        } catch (java.rmi.RemoteException re) {
            throw new Exception(re);
        }*/
    }

    
    public int getSecuencia() {
        return secuencia;
    }

    public StringBuffer getHEDER() {
        return HEADER;
    }

    public String getDir() {
        return dir;
    }

    public void setDir(String dir) {
        this.dir = dir;
    }
    
    public static void main(String arg[]) {
        ClienteHTTP cliente = new ClienteHTTP();
        System.out.println(cliente.getHTML("ServicioReportes/ConfigurarReportes"));
    }
    
    private StringBuffer HEADER = new StringBuffer("");
    private StringBuffer HTML = null;
    private String END = null;
    private Socket socket = null;
    private InputStream is = null;
    private OutputStream os = null;
    private BufferedReader entrada = null;
    private DataInputStream dis = null;
    private PrintStream ps = null;
    private int secuencia = 0;
    private int numeroLinea = 1;
    private DataInputStream br = null;
    private String host = null;
    private Integer pueto = null;
    private String dir = null;
    
    
}
